Coroutines example unit test#10
Conversation
LionZXY
left a comment
There was a problem hiding this comment.
Основная цель задания была все-таки научиться тестировать корутины. Тут же, несмотря на то что по факту тесты проходят, код однопоточный (runBlocking/join) и при некоторых условиях (например, при экстремально малом delay) его результаты выполнения могут отличаться и тесты проходить некорректно. Так же тест может сломаться измененями в будущих версиях Kotlin/внутреннем механизме диспатчинга корутин.
Чтобы упростить работу я решил написать код на который сильно проще написать тест:
class OriginImplementation(
private val scope: CoroutineScope
) {
private val dispatcher = Dispatchers.Default
.limitedParallelism(1)
var counter = 0
suspend fun increaseCounterAndPrintAsync() {
scope.launch(dispatcher) {
val oldCounter = counter++
delay(1000L)
println("$oldCounter and ${counter++}")
}
}
}
Тут важно что я прокидываю scope извне, а значит его можно заменить на TestScope, который развязывает нам руки. Мы, например, можем дожидаться IDLE состояния корутины или, наоборот, пропускать delay. Менять тестируемый код можно, но главное чтобы тест был корректен и для тестирования использовались корутины, а не синхронный код. И да, проверять вывод output stream не обязательно, в том коде что я скинул можно читать counter элемент прямо из теста.
No description provided.